package com.github.binarywang.demo.wx.cp.service;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.github.binarywang.demo.wx.cp.config.mutil.WxCpConfiguration;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.cp.api.WxCpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import okhttp3.*;

import java.io.IOException;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;

@Service
@Slf4j
public class WeComSmartSheetService {

    private WxCpService wxCpService; // 注入WxJava主服务
    //企微相关参数
    @Value("${wechat.cp.corpId}")
    private String corpId = "ww26feccff1b034254";

    @Value("${wechat.cp.agentId}")
    private int agentId = 1000004;

    @Value("${wechat.cp.docId}")
    private String docId;

    @Value("${wechat.cp.sheetId}")
    private String sheetId;

    //简道云相关参数
    @Value("${jdy.appId}")
    private String jdyAppId;
    @Value("${jdy.entryId}")
    private String jdyEntryId;

    @Value("${jdy.apiKey}")
    private String jdyApiKey;

    @Value("${jdy.entryIdBooking}")
    private String jdyEntryIdBooking;

    @Value("${jdy.entryIdOperation}")
    private String jdyEntryIdOperation;

    // 是否启动后首次运行；用于首次运行时，同步指定数量的数据
    boolean isFirstBegin = true;

    @Value("${firstNum:5}")
    private int firstNum;

    @Value("${num:3}")
    private int num;

    public WeComSmartSheetService() {
        this.wxCpService = WxCpConfiguration.getCpService(corpId, agentId);
    }

    /**
     * 定时任务，每间隔5分钟执行一次syncData方法
     */
    @Scheduled(initialDelay = 5000, fixedDelay = 300000)// 300000毫秒 = 5分钟
    public void scheduledSyncData() {
        try {
            log.info("【定时任务执行开始】 ***");
            syncData();
            log.info("【定时任务执行结束】 ***");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 同步数据方法（从企微微信智能表格到简道云）
     * 1. 获取智能表格记录（同步数据）；调用getSheetRecords方法即可
     * 2、推送数据到简道云流程表单；调用updateDataToJdy方法即可
     * 3、额外提供该方法的测试方法，方便开发者调试和测试。
     */
    public String syncData() throws Exception {
        int curNum = 20;
        if (isFirstBegin) {
            isFirstBegin = false;
            if (firstNum > 0) {
                curNum = firstNum;
            }
        } else {
            curNum = num;
        }
        String records = getSheetRecords(curNum);
//        return pushDataToJdy(records);
        return updateDataToJdy(records);
    }


    /**
     * 获取智能表格记录（新增方法）
     *
     * @param docId   文档ID
     * @param sheetId 表格ID
     * @return 表格记录响应数据
     * @throws WxErrorException 微信API调用异常
     */
    public String getSheetRecords(int limitNum) throws WxErrorException {
        log.info("【智能表格】获取子表数据开始，本次将提取最近修改的：" + limitNum + "条记录。");
        String url = "https://qyapi.weixin.qq.com/cgi-bin/wedoc/smartsheet/get_records";
        // 构造请求体（根据API文档调整）
        JSONObject requestBody = new JSONObject();
        requestBody.put("docid", docId);
        requestBody.put("sheet_id", sheetId);

        JSONArray sortArray = new JSONArray();
        JSONObject sortItem = new JSONObject();
        // 修正2：使用字段ID或纯ASCII名称（而非带表情的标题）
        sortItem.put("field_title", "最後編輯時間"); // 替换为实际字段ID或英文名
        sortItem.put("desc", true);  // 修正3：值应为boolean类型
        sortArray.add(sortItem);
        requestBody.put("sort", sortArray);
        requestBody.put("limit", limitNum);

        // 使用WxJava内置的HTTP工具发送请求
        String response = wxCpService.post(url, requestBody.toJSONString());
        log.info("【智能表格】获取子表数据完成");
        return response;
    }

    /**
     * 推送数据到简道云流程表单的方法pushDataToJdy(批量推送）
     * app_id：6785c6c29c468c30505f6d8c；entry_id：67f7da63616bf5f1c911aba0
     * OpenAPI:https://api.jiandaoyun.com/api/v5/app/entry/data/batch_create
     * 简道云官方文档地址：https://hc.jiandaoyun.com/open/14223
     */
    public String pushDataToJdy(String records) throws Exception {
        // 解析入参
        JSONObject recordsJson = JSONObject.parseObject(records);
        JSONArray recordArray = recordsJson.getJSONArray("records");

        // 构造请求体
        JSONObject requestBody = new JSONObject();
        requestBody.put("app_id", jdyAppId); // 确保 app_id 参数存在
        requestBody.put("entry_id", jdyEntryId); // 确保 entry_id 参数存在

        JSONArray dataArray = new JSONArray();
        for (int i = 0; i < recordArray.size(); i++) {
            JSONObject record = recordArray.getJSONObject(i);
            JSONObject values = record.getJSONObject("values");

            JSONObject dataItem = new JSONObject();
            dataItem.put("_widget_1744296547868",
                new JSONObject().put("value", values.getJSONArray("♻️保单号3️⃣4️⃣").getJSONObject(0).getString("text")));
            dataItem.put("_widget_1744296547849",
                new JSONObject().put("value", values.getJSONArray("♻️受保人中文名1️⃣").getJSONObject(0).getString("text")));
            dataItem.put("_widget_1744296547850",
                new JSONObject().put("value", values.getJSONArray("♻️受保人英文名1️⃣2️⃣").getJSONObject(0).getString("text")));
            dataItem.put("_widget_1744296547873",
                new JSONObject().put("value", values.getDouble("♻️首年应缴保费(含征费)3️⃣4️⃣")));
            dataItem.put("_widget_1744296547854",
                new JSONObject().put("value", values.getJSONArray("♻️保单货币1️⃣").getJSONObject(0).getString("text")));
            dataItem.put("_widget_1744296547843",
                new JSONObject().put("value", values.getJSONArray("♻️保单地区1️⃣").getJSONObject(0).getString("text")));

            // 能跑通了，但是dataItem里面值为空
            dataArray.add(dataItem);
        }
        requestBody.put("data_list", dataArray); // 根据官方文档，使用 "data_list" 而非 "data"

        // 使用OkHttpClient发送请求
        OkHttpClient client = new OkHttpClient();
        MediaType mediaType = MediaType.parse("application/json");
        RequestBody body = RequestBody.create(mediaType, requestBody.toJSONString());

        System.out.println(body.toString());
        Request request = new Request.Builder()
            .url("https://api.jiandaoyun.com/api/v5/app/entry/data/batch_create")
            .post(body)
            .addHeader("Authorization", "Bearer " + jdyApiKey) // 需配置该参数
            .addHeader("Content-Type", "application/json")
            .build();

        try (Response response = client.newCall(request).execute()) {
            return response.body().string();
        } catch (IOException e) {
            e.printStackTrace();
            return "Error: " + e.getMessage();
        }
    }

    /**
     * 检查简道云中是否存在指定预约单号的记录
     * 参数：appointmentNumber：预约单号；entryId：表单ID；filterFieldName：过滤字段名称
     * 返回结果：存在则返回简道云查询到的记录id，否则返回null
     */
    private String checkRecordExists(String appointmentNumber, String entryId, String filterFieldName) throws Exception {
        OkHttpClient client = new OkHttpClient().newBuilder().build();
        MediaType mediaType = MediaType.parse("application/json");
        JSONObject requestBody = new JSONObject();
        requestBody.put("app_id", jdyAppId);
        requestBody.put("entry_id", entryId);

        // 构造 filter 字段，严格遵循官方文档格式
        JSONObject filter = new JSONObject();
        filter.put("rel", "and"); // 条件关系为“与”

        JSONArray condArray = new JSONArray();
        JSONObject condItem = new JSONObject();
        condItem.put("field", filterFieldName); // 字段名
        condItem.put("type", "text"); // 字段类型
        condItem.put("method", "eq"); // 方法为“等于”
        condItem.put("value", appointmentNumber); // 查询值
        condArray.add(condItem);

        filter.put("cond", condArray);
        requestBody.put("filter", filter);

        log.info("【简道云-查询记录】 参数：" + requestBody.toJSONString());
        RequestBody body = RequestBody.create(mediaType, requestBody.toJSONString());
        Request request = new Request.Builder()
            .url("https://api.jiandaoyun.com/api/v5/app/entry/data/list")
            .post(body)
            .addHeader("Authorization", "Bearer " + jdyApiKey)
            .addHeader("Content-Type", "application/json")
            .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.body() == null) {
                throw new IOException("Response body is null");
            }
            String responseBody = response.body().string();
            if (responseBody == null || responseBody.isEmpty()) {
                throw new IOException("Response body is empty");
            }
            JSONObject responseJson = JSONObject.parseObject(responseBody);
            if (responseJson == null) {
                throw new IOException("Failed to parse response JSON");
            }
            JSONArray data = responseJson.getJSONArray("data");
            if (data != null && data.size() > 0) {
                // 返回第一条记录的ID
                return data.getJSONObject(0).getString("_id");
            } else {
                return null;
            }
        }
    }

    /**
     * 更新智能表格的同步状态、同步时间和同步简道云记录ID
     */
    private void updateSmartTableStatus(JSONObject record, String status, String jdyRecordId) throws WxErrorException {
        // 构造请求体
        JSONObject requestBody = new JSONObject();
        requestBody.put("docid", docId);
        requestBody.put("sheet_id", sheetId);

        JSONArray records = new JSONArray();
        JSONObject recordToUpdate = new JSONObject();
        recordToUpdate.put("record_id", record.getString("record_id"));

        JSONObject values = new JSONObject().fluentPut("同步状态",  status)
            .fluentPut("同步简道云记录ID", jdyRecordId);

        // 处理时间字段（从原记录获取并保持相同格式）
//        JSONArray lastEditTimeArray = record.getJSONObject("values").optJSONArray("♻️最后编辑时间");
//        if (lastEditTimeArray != null && !lastEditTimeArray.isEmpty()) {
//            String syncTime = lastEditTimeArray.getJSONObject(0).optString("text", "");
//            values.fluentPut("同步时间", new JSONArray()
//                .add(new JSONObject().fluentPut("text", syncTime)));
//        }

        recordToUpdate.put("values", values);
        records.add(recordToUpdate);

        requestBody.put("records", records);

        // 调用企微API更新智能表格记录
        String url = "https://qyapi.weixin.qq.com/cgi-bin/wedoc/smartsheet/update_records";
        wxCpService.post(url, requestBody.toJSONString());
    }

    private void updateSmartTableBookingSyncTime(String recordId, String lastEditTime) throws WxErrorException {
        // 构造请求体
        JSONObject requestBody = new JSONObject();
        requestBody.put("docid", docId);
        requestBody.put("sheet_id", sheetId);

        JSONArray records = new JSONArray();
        JSONObject recordToUpdate = new JSONObject();
        recordToUpdate.put("record_id", recordId);

        JSONObject values = new JSONObject().fluentPut("预约管理同步时间",  lastEditTime);

        // 处理时间字段（从原记录获取并保持相同格式）
//        JSONArray lastEditTimeArray = record.getJSONObject("values").optJSONArray("♻️最后编辑时间");
//        if (lastEditTimeArray != null && !lastEditTimeArray.isEmpty()) {
//            String syncTime = lastEditTimeArray.getJSONObject(0).optString("text", "");
//            values.fluentPut("同步时间", new JSONArray()
//                .add(new JSONObject().fluentPut("text", syncTime)));
//        }

        recordToUpdate.put("values", values);
        records.add(recordToUpdate);

        requestBody.put("records", records);

        // 调用企微API更新智能表格记录
        String url = "https://qyapi.weixin.qq.com/cgi-bin/wedoc/smartsheet/update_records";
        wxCpService.post(url, requestBody.toJSONString());
    }

    /**
     * 回写智能表格的保单运营同步时间
     * @param recordId
     * @param lastEditTime
     * @throws WxErrorException
     */
    private void updateSmartTableOperationSyncTime(String recordId, String lastEditTime) throws WxErrorException {
        // 构造请求体
        JSONObject requestBody = new JSONObject();
        requestBody.put("docid", docId);
        requestBody.put("sheet_id", sheetId);

        JSONArray records = new JSONArray();
        JSONObject recordToUpdate = new JSONObject();
        recordToUpdate.put("record_id", recordId);

        JSONObject values = new JSONObject().fluentPut("保单运营同步时间",  lastEditTime);

        // 处理时间字段（从原记录获取并保持相同格式）
//        JSONArray lastEditTimeArray = record.getJSONObject("values").optJSONArray("♻️最后编辑时间");
//        if (lastEditTimeArray != null && !lastEditTimeArray.isEmpty()) {
//            String syncTime = lastEditTimeArray.getJSONObject(0).optString("text", "");
//            values.fluentPut("同步时间", new JSONArray()
//                .add(new JSONObject().fluentPut("text", syncTime)));
//        }

        recordToUpdate.put("values", values);
        records.add(recordToUpdate);

        requestBody.put("records", records);

        // 调用企微API更新智能表格记录
        String url = "https://qyapi.weixin.qq.com/cgi-bin/wedoc/smartsheet/update_records";
        wxCpService.post(url, requestBody.toJSONString());
    }

    /**
     * 根据入参传来的企业微信智能表格数据逐条同步到简道云流程表单
     * 入参records的参考样例文件是：《智能表格返回子表数据样例V0508.json》
     */
    public String updateDataToJdy(String records) throws Exception {
        log.info("【简道云-同步数据开始】");
        // 解析入参
        JSONObject recordsJson = JSONObject.parseObject(records);
        JSONArray recordArray = recordsJson.getJSONArray("records");

        // 判空处理：确保 recordArray 不为空
        if (recordArray == null || recordArray.isEmpty()) {
            return "Error: No records found in input data.";
        }

        // 构造返回结果
        JSONObject result = new JSONObject();
        result.put("status", "成功");
        result.put("details", new JSONArray());

        // 循环处理每条记录
        for (int i = 0; i < recordArray.size(); i++) {
            JSONObject record = recordArray.getJSONObject(i);
            JSONObject values = record.getJSONObject("values");
            // 最后编辑时间
            String lastEditTime = record.getString("update_time");
            // 取记录id
            String recordId = record.getString("record_id");
            log.info("当前遍历的智能表格记录id为：" + recordId + "； 最后编辑时间为：" + convertToDateTimeFormatted(lastEditTime));
            if (lastEditTime==null) {
                result.getJSONArray("details").add("Error: Last edit time is missing for record " + i);
                continue;
            }

            // 判空处理：确保 values 不为空
            if (values == null) {
                result.getJSONArray("details").add("Error: Values are missing for record " + i);
                continue;
            }

            // 获取预约单号作为主键
            JSONArray appointmentNumberArray = values.getJSONArray("预约单号");
            String appointmentNumber = (appointmentNumberArray != null && !appointmentNumberArray.isEmpty()) ?
                appointmentNumberArray.getJSONObject(0).getString("text") : null;
            // 判空处理：确保预约单号不为空；为空则忽略，不需同步
            if (appointmentNumber == null) {
                result.getJSONArray("details").add("Error: Appointment number is missing for record " + i);
                continue;
            }

            // 同步预约管理数据
            if (updateToJdyBookingManagement(appointmentNumber, values, lastEditTime)) {
                // 回写智能表格预约管理同步时间字段，写入最后编辑时间
//                updateSmartTableBookingSyncTime(recordId, lastEditTime);
            }

            // 同步保单运营数据
            if (updateToJdyOperationData(appointmentNumber, values, lastEditTime)) {
                // 回写智能表格预约管理同步时间字段，写入最后编辑时间
//                updateSmartTableOperationSyncTime(recordId, lastEditTime);
            }

//            // 查询简道云中是否存在该记录
//            String jdyRecordId = checkRecordExists(appointmentNumber, null, null);
//
//            if (jdyRecordId != null) {
//                // 更新现有记录
//                String updateResult = updateExistingRecord(record, jdyRecordId);
//                // 更新智能表格状态
//                updateSmartTableStatus(record, updateResult, jdyRecordId);
//            } else {
//                // 预约单号尚未生成
//                result.getJSONArray("details").add("预约单号尚未生成");
//
//                // 更新智能表格状态;以智能表格中“预约单号”为主键，只更新同步状态、同步时间、同步简道云记录ID三个字段，其他字段不要更新。
//                updateSmartTableStatus(record, "预约单号尚未生成", null);
//            }
        }
        log.info("【简道云-同步数据完成】");
        return result.toJSONString();
    }

    /**
     * 更新数据到简道云的预约管理表单中，入参values为企微智能表格获取的子表数据单条记录
     * 步骤：1、获取预约单号、預約狀態、合作方行政收費記錄、最後編輯時間、预约管理同步时间，数据样例参考《》；
     * 2、判断：如果预约单号为空，则不同步，返回null
     * 3、判断：最後編輯時間、预约管理同步时间相同，则不同步，返回null；
     * 3.1、调用checkRecordExists接口，判断该条数据是否已存在，参数说明见被调用方法的注释；如不存在返回null
     * 4、以预约单号作为主键，更新简道云【預約管理_API同步测试】表单中该条数据的預約狀態、合作方行政收費記錄两个字段
     * 5、如果更新成功则返回最後編輯時間字段内容，其他情况返回null
     * 6、简道云
     * @param values
     */
    private boolean updateToJdyBookingManagement(String appointmentNumber, JSONObject values, String lastEditTime) throws Exception {
        String syncTime = values.getString("预约管理同步时间"); // 直接获取时间戳字符串
        // 2. 判断：如果预约单号为空，则不同步，返回null
        if (appointmentNumber == null || appointmentNumber.isEmpty()) {
            return false;
        }
        // 3. 判断：最後編輯時間、预约管理同步时间相同，则不同步，返回null
        if (lastEditTime != null && lastEditTime.equals(syncTime)) {
            return false;
        }
        // 3.1 调用checkRecordExists接口，判断该条数据是否已存在。_widget_1746126621934：预约单号字段名
        String jdyRecordId = checkRecordExists(appointmentNumber, jdyEntryIdBooking, "_widget_1746126621934");
        if (jdyRecordId == null) {
            log.info("【简道云-查询预约管理记录】该预约单号未找到：" + appointmentNumber);
            return false;
        }

        return updateExistingRecordForBooking(values, jdyRecordId, lastEditTime);
    }

    private boolean updateToJdyOperationData(String appointmentNumber, JSONObject values, String lastEditTime) throws Exception {
        String syncOperationDataTime = values.getString("保单运营同步时间"); // 直接获取时间戳字符串
        // 2. 判断：如果预约单号为空，则不同步，返回null
        if (appointmentNumber == null || appointmentNumber.isEmpty()) {
            return false;
        }
        // 3. 判断：最後編輯時間、保单运营同步时间相同，则不同步，返回null
        if (lastEditTime != null && lastEditTime.equals(syncOperationDataTime)) {
            return false;
        }
        // 3.1 调用checkRecordExists接口，判断该条数据是否已存在。_widget_1732245701324：预约单号字段名
        String jdyRecordId = checkRecordExists(appointmentNumber, jdyEntryIdOperation, "_widget_1732245701324");
        if (jdyRecordId == null) {
            log.info("【简道云-查询保单运营记录】该预约单号未找到：" + appointmentNumber);
            return false;
        }

        return updateExistingRecordForOperationData(values, jdyRecordId, lastEditTime);
    }

    /**
     * 更新现有记录
     */
    private String updateExistingRecord(JSONObject record, String jdyRecordId) throws Exception {
        OkHttpClient client = new OkHttpClient();
        MediaType mediaType = MediaType.parse("application/json");
        JSONObject requestBody = new JSONObject();
        requestBody.put("app_id", jdyAppId);
        requestBody.put("entry_id", jdyEntryId);
        requestBody.put("data_id", jdyRecordId); // 添加 data_id 字段

        JSONObject dataItem = new JSONObject();
        JSONObject values = record.getJSONObject("values");

        // 判空处理并提供默认值
        JSONArray policyNumberArray = values.getJSONArray("♻️保单号3️⃣4️⃣");
        dataItem.put("_widget_1744296547868",
            new JSONObject().fluentPut("value", policyNumberArray != null && !policyNumberArray.isEmpty() ?
                policyNumberArray.getJSONObject(0).getString("text") : ""));

        dataItem.put("_widget_1744296547849",
            new JSONObject().fluentPut("value",
                values.getJSONArray("♻️受保人中文名1️⃣") != null &&
                !values.getJSONArray("♻️受保人中文名1️⃣").isEmpty() ?
                values.getJSONArray("♻️受保人中文名1️⃣").getJSONObject(0).getString("text") : ""));

        dataItem.put("_widget_1744296547850",
            new JSONObject().fluentPut("value",
                values.getJSONArray("♻️受保人英文名1️⃣2️⃣") != null &&
                !values.getJSONArray("♻️受保人英文名1️⃣2️⃣").isEmpty() ?
                values.getJSONArray("♻️受保人英文名1️⃣2️⃣").getJSONObject(0).getString("text") : ""));

        Double firstYearPremium = values.getDoubleValue("♻️首年应缴保费(含征费)3️⃣4️⃣");
        dataItem.put("_widget_1744296547873",
            new JSONObject().fluentPut("value", firstYearPremium != null ? firstYearPremium : 0.0));

        JSONArray currencyArray = values.getJSONArray("♻️保单货币1️⃣");
        dataItem.put("_widget_1744296547854",
            new JSONObject().fluentPut("value", currencyArray != null && !currencyArray.isEmpty() ?
                currencyArray.getJSONObject(0).getString("text") : ""));

        JSONArray regionArray = values.getJSONArray("♻️保单地区1️⃣");
        dataItem.put("_widget_1744296547843",
            new JSONObject().fluentPut("value", regionArray != null && !regionArray.isEmpty() ?
                regionArray.getJSONObject(0).getString("text") : ""));
        // 仿照上面字段增加一个"♻️保单状态1️⃣4️⃣5️⃣"字段，对应简道云中字段为：_widget_1744296547830
        dataItem.put("_widget_1744296547830",
            new JSONObject().fluentPut("value",
                values.getJSONArray("♻️保单状态1️⃣4️⃣5️⃣") != null &&
                !values.getJSONArray("♻️保单状态1️⃣4️⃣5️⃣").isEmpty() ?
                values.getJSONArray("♻️保单状态1️⃣4️⃣5️⃣").getJSONObject(0).getString("text") : ""));

        requestBody.put("data", dataItem);

        System.out.println("【简道云-修改单条记录】入参：" + requestBody.toJSONString());
        RequestBody body = RequestBody.create(mediaType, requestBody.toJSONString());
        Request request = new Request.Builder()
            .url("https://api.jiandaoyun.com/api/v5/app/entry/data/update")
            .post(body)
            .addHeader("Authorization", "Bearer " + jdyApiKey)
            .addHeader("Content-Type", "application/json")
            .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.code() == 200) {
                return "同步成功";
            } else {
                return "同步失败";
            }
        }
    }

    /**
     * 更新简道云运营表单数据
     * @param values
     * @param jdyRecordId
     * @param lastEditTime
     * @return
     * @throws Exception
     */
    private boolean updateExistingRecordForOperationData(JSONObject values, String jdyRecordId, String lastEditTime) throws Exception {
        OkHttpClient client = new OkHttpClient();
        MediaType mediaType = MediaType.parse("application/json");
        JSONObject requestBody = new JSONObject();
        requestBody.put("app_id", jdyAppId);
        requestBody.put("entry_id", jdyEntryIdOperation);
        requestBody.put("data_id", jdyRecordId); // 添加 data_id 字段
        JSONObject dataItem = new JSONObject();

        // TODO: 从智能表格获取的values数据中组织需要的数据用于提交到简道云做记录字段的更新。
        // 1. 预约单号
        // 不用修改，注释掉
//        dataItem.put("_widget_1732245701324",
//            new JSONObject().fluentPut("value", getUrlFieldValue(values, "预约单号")));

//        // 2. 預約狀態
//        // 已客户核实，保单运营表无需同步此字段
//        dataItem.put("_widget_1732611207700",
//            new JSONObject().fluentPut("value", getFieldValue(values, "預約狀態")));

        // 3. 合作方行政收费记录  ok
        dataItem.put("_widget_1744203508774",
            new JSONObject().fluentPut("value", getFieldValue(values, "合作方行政收費記錄")));

        // 4. 签单经纪行  ok
        dataItem.put("_widget_1733457042508",
            new JSONObject().fluentPut("value", getFieldValue(values, "簽單經紀行")));

        // 5. 保单状态  ok
        dataItem.put("_widget_1730771771122",
            new JSONObject().fluentPut("value", getFieldValue(values, "保單狀態")));

        // 6. 沟通群组  ok
        dataItem.put("_widget_1730771771121",
            new JSONObject().fluentPut("value", getFieldValue(values, "溝通群組")));

        // 7. 会面TR  ok
        dataItem.put("_widget_1732245763878",
            new JSONObject().fluentPut("value", getFieldValue(values, "會面TR")));

        // 8. TR(IA表)  ok
        dataItem.put("_widget_1735449850456",
            new JSONObject().fluentPut("value", getFieldValue(values, "TR(IA表)")));

        // 9. 保单特别备注  ok
        dataItem.put("_widget_1730771771149",
            new JSONObject().fluentPut("value", getFieldValue(values, "保單特別備註")));

        // 10. 融资信息(如适用)  ok
        dataItem.put("_widget_1730771771169",
            new JSONObject().fluentPut("value", getFieldValue(values, "融資信息(如適用)")));

        // 11. 预约参考计划书及当月优惠文件  TODO  智能表格为链接类型，简道云为附件类型，链接文本无法插入
//        dataItem.put("_widget_1743955161125",
//            new JSONObject().fluentPut("value", getUrlFieldValue(values, "預約參考計劃書及當月優惠文件")));
//        // 新增文本测试字段（仅测试用，对应简道云：預約參考計劃書及當月優惠文件(单行文本)）
        dataItem.put("_widget_1746755025433",
            new JSONObject().fluentPut("value", getUrlsFieldValue(values, "預約參考計劃書及當月優惠文件")));  // getUrlFieldValue(values, "預約參考計劃書及當月優惠文件")));



        // 12. 预约表及填单文件   TODO 同上，待确认

//        dataItem.put("_widget_1743955161119",
//            new JSONObject().fluentPut("value", getUrlFieldValue(values, "預約表及填單文件")));
//        // 新增测试字段，預約表及填單文件(单行文本)
        dataItem.put("_widget_1746840479756",
            new JSONObject().fluentPut("value", getUrlsFieldValue(values, "預約表及填單文件")));

        // 13. 已签名公司四宝   TODO 同上，待确认
        // 改为文件类型，待验证


//        dataItem.put("_widget_1733812095091",
//            new JSONObject().fluentPut("value", getFieldValue(values, "已簽名公司四章")));
//        // 新增测试字段，已簽名公司四章(单行文本)
        dataItem.put("_widget_1746840479757",
            new JSONObject().fluentPut("value", getUrlsFieldValue(values, "已簽名公司四寶")));

        // 14. 簽單現場資料    TODO 同上，待确认
//        dataItem.put("_widget_1740454148960",
//            new JSONObject().fluentPut("value", getFieldValue(values, "簽單現場資料")));
//        // 新增测试字段，簽單現場資料(单行文本)
        dataItem.put("_widget_1746840479758",
            new JSONObject().fluentPut("value", getUrlsFieldValue(values, "簽單現場資料")));

        // 15. 现场是否有POS待提交    ok
        dataItem.put("_widget_1743955161120",
            new JSONObject().fluentPut("value", getFieldValue(values, "現場是否有POS待提交")));

        // 16. 计划书日期  ok
        dataItem.put("_widget_1730771771163",
            new JSONObject().fluentPut("value", convertToDate(values.getString("計劃書日期"))));

        // 17. 保单号  ok
        dataItem.put("_widget_1730771771168",
            new JSONObject().fluentPut("value", getFieldValue(values, "保單號")));

        // 18. 首年计划书保费(不含微费)  ok
        dataItem.put("_widget_1732787132747",
            new JSONObject().fluentPut("value", values.getIntValue( "首年計劃書保費 (不含徵費)")));

        // 19. 首年特别折扣率  ok
        dataItem.put("_widget_1746204509313",
            new JSONObject().fluentPut("value", getFieldValue(values, "首年特別折扣率")));

        // 20. 佣金减少比率  ok
        dataItem.put("_widget_1732778973300",
            new JSONObject().fluentPut("value", getFieldValue(values, "佣金減少比率")));

        // 21. 首年应缴保费(含微费)  ok
        dataItem.put("_widget_1730771771167",
            new JSONObject().fluentPut("value", getFieldValue(values, "首年應繳保費(含微費)")));

        // 22. 保司投保文件   TODO  附件链接类型，同上
//        dataItem.put("_widget_1731056793847",
//            new JSONObject().fluentPut("value", getFieldValue(values, "保司投保文件")));
//        // 新增测试字段，保司投保文件(单行文本)
        dataItem.put("_widget_1746840479759",
            new JSONObject().fluentPut("value", getUrlsFieldValue(values, "保司投保文件")));

        //  首期繳費資料存檔   TODO  附件链接类型，同上
//        // 新增测试字段，首期繳費資料存檔(单行文本)
        dataItem.put("_widget_1746840479760",
            new JSONObject().fluentPut("value", getUrlsFieldValue(values, "首期繳費資料存檔")));

        //  pending處理資料存檔    TODO  附件链接类型，同上
        // 新增测试字段，pending處理資料存檔(单行文本)
        dataItem.put("_widget_1746840479761",
            new JSONObject().fluentPut("value", getUrlsFieldValue(values, "pending處理資料存檔")));

        //  生效前變更狀態   ok
        dataItem.put("_widget_1730771771191",
            new JSONObject().fluentPut("value", getFieldValue(values, "生效前變更狀態")));

        //  生效前變更跟進記錄    ok
        dataItem.put("_widget_1733387919739",
            new JSONObject().fluentPut("value", getFieldValue(values, "生效前變更跟進記錄")));


        // 26. 缴费状态  ok
        dataItem.put("_widget_1730771771170",
            new JSONObject().fluentPut("value", getFieldValue(values, "繳費狀態")));

        // 27. 缴费跟进记录  ok
        dataItem.put("_widget_1732294567650",
            new JSONObject().fluentPut("value", getFieldValue(values, "繳費跟進記錄")));

        //  Pending狀態  ok
        dataItem.put("_widget_1730771771174",
            new JSONObject().fluentPut("value", getFieldValue(values, "Pending狀態")));

        //  Pending跟進記錄  ok
        dataItem.put("_widget_1732506009911",
            new JSONObject().fluentPut("value", getFieldValue(values, "Pending跟進記錄")));

        //  TR pending跟進備註  ok
        dataItem.put("_widget_1742962536825",
            new JSONObject().fluentPut("value", getFieldValue(values, "TR pending跟進備註")));

        //  實際合作方介紹費率  TODO  除以100 待验证
        dataItem.put("_widget_1746501460549",
            new JSONObject().fluentPut("value", getBigDecimalFieldValue(values, "實際合作方介紹費率")));   //values.getBigDecimal("實際合作方介紹費率").movePointLeft(2)));

        // 28. 最后编辑人  ok
        dataItem.put("_widget_1742962536851",
            new JSONObject().fluentPut("value", getFieldValue(values, "最後編輯人")));

        // 29. 最后编辑时间  ok
        // 将时间戳形式的lastEditTime值转化成日期时间格式的字符串，并用一个变量接收
        String lastEditTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(Long.parseLong(lastEditTime)));
        dataItem.put("_widget_1742962536852",
            new JSONObject().fluentPut("value", lastEditTimeFormat));

        // 30. 保单地区  ok
        dataItem.put("_widget_1743955160574",
            new JSONObject().fluentPut("value", getFieldValue(values, "保單地區")));

        //  名義保額  ok
        dataItem.put("_widget_1730771771154",
            new JSONObject().fluentPut("value", values.getIntValue("名義保額")));

        //  繳費頻率  ok
        dataItem.put("_widget_1730771771157",
            new JSONObject().fluentPut("value", getFieldValue(values, "繳費頻率")));

        // 32. 产品名称  ok
        dataItem.put("_widget_1730771771151",
            new JSONObject().fluentPut("value", getFieldValue(values, "產品名稱")));

        // 33. 保单货币  ok
        dataItem.put("_widget_1730771771153",
            new JSONObject().fluentPut("value", getFieldValue(values, "保單貨幣")));

        // 34. 附加险  ok
        dataItem.put("_widget_1730771771152",
            new JSONObject().fluentPut("value", getFieldValue(values, "附加險")));

        // 31. 保险公司  ok
        dataItem.put("_widget_1730771771150",
            new JSONObject().fluentPut("value", getFieldValue(values, "保險公司")));


//        // 1. 获取預約狀態、合作方行政收費記錄
//        JSONArray appointmentStatusArray = values.getJSONArray("預約狀態");
//        dataItem.put("_widget_1732611207700",
//            new JSONObject().fluentPut("value", appointmentStatusArray != null && !appointmentStatusArray.isEmpty() ?
//                appointmentStatusArray.getJSONObject(0).getString("text") : ""));
//
//        JSONArray adminFeeRecordArray = values.getJSONArray("合作方行政收費記錄");
//        // 下拉复选框，因简道云设置了选项内容，故文本值无法写入；下行新建文本字段可以写入
//        dataItem.put("_widget_1740741363010",
//            new JSONObject().fluentPut("value", adminFeeRecordArray != null && !adminFeeRecordArray.isEmpty() ?
//                adminFeeRecordArray.getJSONObject(0).getString("text") : ""));
//        // 新加测试字段：合作方行政收费记录；因是纯文本，可以写入
//        dataItem.put("_widget_1746626989111",
//            new JSONObject().fluentPut("value", adminFeeRecordArray != null && !adminFeeRecordArray.isEmpty() ?
//                adminFeeRecordArray.getJSONObject(0).getString("text") : ""));

        requestBody.put("data", dataItem);
        log.info("【简道云-保单运营-修改单条记录】入参：" + requestBody.toJSONString());
        RequestBody body = RequestBody.create(mediaType, requestBody.toJSONString());
        Request request = new Request.Builder()
            .url("https://api.jiandaoyun.com/api/v5/app/entry/data/update")
            .post(body)
            .addHeader("Authorization", "Bearer " + jdyApiKey)
            .addHeader("Content-Type", "application/json")
            .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.code() == 200) {
                return true;
            } else {
                return false;
            }
        }
    }

    /**
     * 更新简道云运营管理表单数据
     * @param values
     * @param jdyRecordId
     * @param lastEditTime
     * @return
     * @throws Exception
     */
    private boolean updateExistingRecordForBooking(JSONObject values, String jdyRecordId, String lastEditTime) throws Exception {
        OkHttpClient client = new OkHttpClient();
        MediaType mediaType = MediaType.parse("application/json");
        JSONObject requestBody = new JSONObject();
        requestBody.put("app_id", jdyAppId);
        requestBody.put("entry_id", jdyEntryId);
        requestBody.put("data_id", jdyRecordId); // 添加 data_id 字段

        JSONObject dataItem = new JSONObject();

        // 1. 获取預約狀態、合作方行政收費記錄
        JSONArray appointmentStatusArray = values.getJSONArray("預約狀態");
        dataItem.put("_widget_1732611207700",
            new JSONObject().fluentPut("value", appointmentStatusArray != null && !appointmentStatusArray.isEmpty() ?
                appointmentStatusArray.getJSONObject(0).getString("text") : ""));

        JSONArray adminFeeRecordArray = values.getJSONArray("合作方行政收費記錄");
        // 下拉复选框，因简道云设置了选项内容，故文本值无法写入；下行新建文本字段可以写入
        dataItem.put("_widget_1740741363010",
            new JSONObject().fluentPut("value", adminFeeRecordArray != null && !adminFeeRecordArray.isEmpty() ?
                adminFeeRecordArray.getJSONObject(0).getString("text") : ""));
        // 新加测试字段：合作方行政收费记录；因是纯文本，可以写入
        dataItem.put("_widget_1746626989111",
            new JSONObject().fluentPut("value", adminFeeRecordArray != null && !adminFeeRecordArray.isEmpty() ?
                adminFeeRecordArray.getJSONObject(0).getString("text") : ""));

        // 28. 最后编辑人  TODO 待验证
        dataItem.put("_widget_1747014077376",
            new JSONObject().fluentPut("value", getFieldValue(values, "最後編輯人")));

        // 29. 最后编辑时间  TODO 待验证
        // 将时间戳形式的lastEditTime值转化成日期时间格式的字符串，并用一个变量接收
        String lastEditTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(Long.parseLong(lastEditTime)));
        dataItem.put("_widget_1747014077377",
            new JSONObject().fluentPut("value", lastEditTimeFormat));

        requestBody.put("data", dataItem);

        log.info("【简道云-预约管理-修改单条记录】入参：" + requestBody.toJSONString());
        RequestBody body = RequestBody.create(mediaType, requestBody.toJSONString());
        Request request = new Request.Builder()
            .url("https://api.jiandaoyun.com/api/v5/app/entry/data/update")
            .post(body)
            .addHeader("Authorization", "Bearer " + jdyApiKey)
            .addHeader("Content-Type", "application/json")
            .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.code() == 200) {
                return true;
            } else {
                return false;
            }
        }
    }

    /**
     * 抽取结果集中bigDecimal数据
     * @param values
     * @param fieldName
     * @return
     */
    private BigDecimal getBigDecimalFieldValue(JSONObject values, String fieldName) {
        try {
            BigDecimal bigDecimal = values.getBigDecimal(fieldName);
            return bigDecimal != null ?
                bigDecimal.movePointLeft(2) : BigDecimal.ZERO;
        } catch (Exception e) {
            return BigDecimal.ZERO;
        }
    }


    // 获取普通字段值的方法
    private String getFieldValue(JSONObject values, String fieldName) {
        try {
            JSONArray fieldArray = values.getJSONArray(fieldName);
            return fieldArray != null && !fieldArray.isEmpty() ?
                fieldArray.getJSONObject(0).getString("text") : "";
        } catch (Exception e) {
            return "";
        }
    }

    // 新增：获取URL类型字段值的方法（支持多个URL）
    private String getUrlsFieldValue(JSONObject values, String fieldName) {
        try {
            JSONArray fieldArray = values.getJSONArray(fieldName);
            if (fieldArray == null || fieldArray.isEmpty()) {
                return "";
            }

            StringBuilder urls = new StringBuilder();
            for (int i = 0; i < fieldArray.size(); i++) {
                JSONObject fieldObj = fieldArray.getJSONObject(i);
                if (fieldObj.containsKey("file_url")) {
                    String url = fieldObj.getString("file_url");
                    if (urls.length() > 0) {
                        urls.append("; ");
                    }
                    urls.append(url);
                }
            }
            return urls.toString();
        } catch (Exception e) {
            return "";
        }
    }

    private String getFieldValueForDate(JSONObject values, String fieldName) {
        try {
            String field = values.getString(fieldName);
            // field是时间戳毫秒数字符串（如:1746760546038），需格式化成yyyy-MM-dd的日期格式的字符串
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date date = sdf.parse(field);
            String strDate = sdf.format(date);
            return strDate;

        } catch (Exception e) {
            return "";
        }
    }

    private String getFieldValueForDateTime(JSONObject values, String fieldName) {
        try {
            String field = values.getString(fieldName);
            // 将field字符串格式化成yyyy-MM-dd的日期格式的字符串
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = sdf.parse(field);
            String strDate = sdf.format(date);
            return strDate;
        } catch (Exception e) {
            return "";
        }
    }

    // 获取URL类型字段值的方法
    private String getUrlFieldValue(JSONObject values, String fieldName) {
        try {
            JSONArray fieldArray = values.getJSONArray(fieldName);
            if (fieldArray != null && !fieldArray.isEmpty()) {
                JSONObject fieldObj = fieldArray.getJSONObject(0);
                return fieldObj.containsKey("link") ?
                    fieldObj.getString("link") : fieldObj.getString("text");
            }
            return "";
        } catch (Exception e) {
            return "";
        }
    }

    public Date convertToDate(String timestamp) {
        if(timestamp == null || timestamp.isEmpty()) {
            return null;
        }
        long timestampL = Long.parseLong(timestamp);
        // 1. 转换为Instant
        Instant instant = Instant.ofEpochMilli(timestampL);

        // 2. 转为LocalDate（自动使用系统时区）
        LocalDate localDate = instant.atZone(ZoneId.systemDefault()).toLocalDate();

        // 3. 转回Date（时分秒自动清零）
        return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
    }


    public String convertToDateFormatted(String timestamp) {
        Instant instant = Instant.ofEpochMilli(Long.parseLong(timestamp));
        LocalDate localDate = instant.atZone(ZoneId.systemDefault()).toLocalDate();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        return localDate.format(formatter);
    }

    public String convertToDateTimeFormatted(String timestamp) {
        Instant instant = Instant.ofEpochMilli(Long.parseLong(timestamp));
        LocalDateTime localDateTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return localDateTime.format(formatter);
    }

}
